home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / simulato / v2_3_mc6.tz / v2_3_mc6 / testfiles / bin2hex.asm next >
Assembly Source File  |  1994-05-02  |  5KB  |  120 lines

  1. **** SUBROUTINE BIN2HEX ****
  2. * This purpose of this code is to convert a string whose representation
  3. * is of a binary input and convert it to a string whose representation
  4. * is of a hex input.  The user is required to pass the parameters on the
  5. * stack by standard convention as follows:
  6. *
  7. *       |---------------------------------------------------|
  8. *       |    POINTER TO STRING TO BE CONVERTED(LONGWORD)    |
  9. *       |---------------------------------------------------|
  10. *       | POINTER TO PLACE WHERE OUTPUT STRING IS(LONGWORD) |
  11. *       |---------------------------------------------------|
  12. *       |              NEGATIVE FLAG(WORD)                  |
  13. *       |---------------------------------------------------|
  14. *
  15. * The negative flag in this routine is an output, and may be retreived
  16. * by the user for their program's.  However, the returned string will always
  17. * be converted to a 2's complement positive representation.
  18. *****************************
  19. **** RESOURCES ****
  20. *  a2 -> pointer to first char. in string to be converted.
  21. *  a5 -> pointer to output location.
  22. *  d2 -> read char/overall bit count.
  23. *  d3 -> holder of the negative flag.
  24. *  d4 -> temporay convereted result.
  25. *  d5 -> counter for temp. result.
  26. *  d6 -> result overall.
  27. *  d7 -> scratch reg.
  28. *
  29. *******************
  30.  
  31.         SECTION B2H,code                ;define section for this
  32.         XDEF BIN2HEX                    ;sub. and tell of exeternal use.
  33.  
  34. BIN2HEX LINK A6,#0                      ;take care of standard param. pass.
  35.         MOVEM.L A0-A5/D0-D2/D4-D7,-(A7) ;save all reg. but d3 because output.
  36.  
  37.         CLR.L D3                        ;clear neg. flag.
  38.         CLR.L D4                        ;clear temp converted digit.
  39.         CLR.L D5                        ;clear counter for digit.
  40.         CLR.L D6                        ;clear overall result.
  41.  
  42.         MOVEA.L 8(A6),A2                ;move in param. for parsed string.
  43.         MOVEA.L 12(A6),A5               ;move in param. for output string.
  44.  
  45. B_STR2NUM MOVE.B (A2)+,D2               ;move in most sig. char from input.
  46.         CMPI.B #0,D2                    ;if found char. is NULLL then
  47.         BEQ.W MAKE_HEX_STR              ;branch to place in string
  48.         CMPI.B #' ',D2                  ;else if found char. is SPACE
  49.         BEQ.S B_STR2NUM                 ;ignore.
  50.  
  51.         ROXR.B #1,D2                    ;else place bit 0 in extend.
  52.         ROXL.W #1,D6                    ;put found bit in temp result.
  53.         BRA.S B_STR2NUM                 ;repeat till the end of string.
  54.  
  55. MAKE_HEX_STR TST.W D6                   ;if the overall result is
  56.         BMI.S B_NEG                     ;negative take care of it.
  57.         BNE.S B_FIND1                   ;else check for zero if not ok
  58.         MOVE.B #'0',(A5)+               ;else put zero in string
  59.         BRA.W END_B2H                   ;and return.
  60.  
  61. B_NEG   ADDQ.W #1,D3                    ;set negative flag.
  62.         MOVE.W D3,16(A6)                ;put return param. on stack
  63.         NEG.W D6                        ;negate the results.
  64.  
  65. B_FIND1 CLR.L D2                        ;clear overall counter.
  66.  
  67. 1$      ROXL.W #1,D6                    ;move MSB of result to extend
  68.         ROXL.W #1,D4                       ;move that bit to 4 bit result
  69.         ADDQ.W #1,D5                    ;increment the local bit counter.
  70.         ADDQ.W #1,D2                    ;increment total bit count.
  71.         CMPI.W #4,D5                    ;test if this is the end of nib.
  72.         BNE.S 1$                        ;if not cont w/ rotation.
  73.         TST.W D4                        ;is 4 bit result 0
  74.         BNE.S B_PUT1                    ;if not place 1st char in string.
  75.         CLR.W D4                        ;clear 4 bit result.
  76.         CLR.W D5                        ;clear 4 bit counter.
  77.         BRA.S 1$                        ;repeat process.
  78.  
  79. B_PUT1  CMPI.W #9,D4                    ;see if 4 bit result is > 9
  80.         BLE.S B_DIGISNUM                ;if so then it is chr.
  81. B_DIGISCHR ADDQ.W #7,D4                 ;so add chr. offset.
  82. B_DIGISNUM ADDI.W #$30,D4               ;add ASCII offset.
  83.         MOVE.B D4,(A5)+                 ;move into output string.
  84.         CLR.W D4                        ;clear 4 bit result.
  85.         CLR.W D5                        ;clear 4 bit counter.
  86.         CMPI.W #16,D2                   ;is total bit count @ end.
  87.         BEQ.S END_B2H                   ;if so end.
  88.  
  89. B_FIND2END ROXL.W #1,D6                 ;else move MSB of result to extend
  90.         ROXL.W #1,D4                    ;move bit 4 bit holder.
  91.         ADDQ.W #1,D2                    ;inc. overall bit count.
  92.         ADDQ.W #1,D5                    ;inc. 4 bit count.
  93.         CMPI.W #4,D5                    ;test for end of nibble.
  94.         BNE.S B_FIND2END                ;if not repeat
  95.         BRA.S B_PUT1                    ;else place in string.
  96.  
  97. END_B2H MOVE.B #0,(A5)                  ;put terminator in string.
  98.         MOVEM.L (A7)+,D0-D2/D4-D7/A0-A5 ;restore all registers.
  99.         UNLK A6                         ;restore stack to entry point.
  100.         RTS                             ;return
  101.  
  102.         END
  103.         
  104.  
  105.         
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.